package Veterinaria.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;

import Veterinaria.excepcion.CodigoDuplicadoExcepcion;
import Veterinaria.excepcion.DAOExcepcion;
import Veterinaria.modelo.Articulo;
import Veterinaria.util.ConexionBD;

public class ArticuloDAO extends BaseDAO {

	public Collection<Articulo> buscarPorDescripcion(String descripcion)
			throws DAOExcepcion {
		String query = "select idarticulo, descripcion, unidadmed, precio, estado from articulo where  nombre like ?";
		Collection<Articulo> lista = new ArrayList<Articulo>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, "%" + descripcion + "%");
			rs = stmt.executeQuery();
			while (rs.next()) {
				Articulo vo = new Articulo();
				vo.setCod_articulo(rs.getString("idarticulo"));
				vo.setDescripcion(rs.getString("descripcion"));
				vo.setUni_med(rs.getString("unidadmed"));
				vo.setPrecio(rs.getDouble("precio"));
				vo.setEstado(rs.getString("estado"));
				lista.add(vo);
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		System.out.println(lista.size());
		return lista;
	}

	public Articulo insertar(Articulo vo) throws DAOExcepcion, CodigoDuplicadoExcepcion {
		String query = "insert into articulo(idarticulo, descripcion, unidadmed, precio, estado) values (?,?,?,?,?)";
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		
		if(NoExisteArticulo(vo.getCod_articulo())){
		
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getCod_articulo());
			stmt.setString(2, vo.getDescripcion());
			stmt.setString(3, vo.getUni_med());
			stmt.setDouble(4, vo.getPrecio());
			stmt.setString(5, vo.getEstado());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo insertar");
			}
			// Obtener el ultimo id
			int id = 0;
			String idArticulo;
			query = "select last_insert_id()";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()) {
				id = rs.getInt(1);
			}
			//
			idArticulo = id + "";
			//
			vo.setCod_articulo(idArticulo);

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		}
		else throw new CodigoDuplicadoExcepcion(vo.getCod_articulo());
		return vo;
	}

	public Articulo obtener(String idArticulo) throws DAOExcepcion {
		Articulo vo = new Articulo();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select idarticulo, descripcion, unidadmed, precio, estado from articulo where idarticulo=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, idArticulo);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setCod_articulo(rs.getString(1));
				vo.setDescripcion(rs.getString(2));
				vo.setUni_med(rs.getString(3));
				vo.setPrecio(rs.getDouble(4));
				vo.setEstado(rs.getString(5));
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public void eliminar(String idArticulo) throws DAOExcepcion {
		//String query = "delete from articulo WHERE idarticulo=?";
		String query = "update articulo set estado='0' where idarticulo=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, idArticulo);
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo eliminar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}

	public Articulo actualizar(Articulo vo) throws DAOExcepcion {
		String query = "update articulo set descripcion=?, unidadmed=?, precio=?, estado=? where idarticulo=?";
		Connection con = null;
		PreparedStatement stmt = null;
		try {
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, vo.getDescripcion());
			stmt.setString(2, vo.getUni_med());
			stmt.setDouble(3, vo.getPrecio());
			stmt.setString(4, vo.getEstado());
			stmt.setString(5, vo.getCod_articulo());
			int i = stmt.executeUpdate();
			if (i != 1) {
				throw new SQLException("No se pudo actualizar");
			}
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return vo;
	}

	public Collection<Articulo> listar() throws DAOExcepcion {
		Collection<Articulo> a = new ArrayList<Articulo>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			String query = "select idarticulo,descripcion,unidadmed,precio,estado from articulo order by descripcion";
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Articulo vo = new Articulo();
				vo.setCod_articulo(rs.getString("idarticulo"));
				vo.setDescripcion(rs.getString("descripcion"));
				vo.setUni_med(rs.getString("unidadmed"));
				vo.setPrecio(rs.getDouble("precio"));
				// vo.setEstado(rs.getString("estado"));
				a.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return a;
	}
    private boolean NoExisteArticulo(String codigo) throws DAOExcepcion {
        return obtenerArticulo(codigo) == null;
    }
    
	public Articulo obtenerArticulo(String idArticulo) throws DAOExcepcion {
		Articulo vo = new Articulo();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			String query = "select idarticulo, descripcion, unidadmed, precio, estado from articulo where idarticulo=?";
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			stmt.setString(1, idArticulo);
			rs = stmt.executeQuery();
			if (rs.next()) {
				vo.setCod_articulo(rs.getString(1));
				vo.setDescripcion(rs.getString(2));
				vo.setUni_med(rs.getString(3));
				vo.setPrecio(rs.getDouble(4));
				vo.setEstado(rs.getString(5));
				return vo;
			}else return null;
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
    
	public Collection<Articulo> ListaArticuloXDescripcion(String descripcion)
			throws DAOExcepcion {
		Collection<Articulo> l = new ArrayList<Articulo>();
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			con = ConexionBD.obtenerConexion();
			descripcion = '%' + descripcion + '%';
			String query = "select idarticulo, descripcion, unidadmed, precio, estado from articulo Where estado='1' and descripcion like ?";

			stmt = con.prepareStatement(query);
			stmt.setString(1, descripcion);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Articulo vo = new Articulo();
				vo.setCod_articulo(rs.getString("idarticulo"));
				vo.setDescripcion(rs.getString("descripcion"));
				vo.setUni_med(rs.getString("unidadmed"));
				vo.setPrecio(rs.getDouble("precio"));
				vo.setEstado(rs.getString("estado"));
				l.add(vo);
			}

		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return l;
	}
	
	public Collection<Articulo> obtenerReporteArticulos(String idarticulo, String detalle, String estado) throws DAOExcepcion {
		Collection<Articulo> l = new ArrayList<Articulo>();
		
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		String query;
		try {
			 
				// System.out.println("En las otras " + tipo);
				query = "SELECT distinct  idarticulo, descripcion, unidadmed, precio, estado from "+
				        " articulo WHERE idarticulo like '%" + idarticulo + "%' " +
						" and descripcion like '%" + detalle + "%' " +
				        " and estado like '%" + estado + "%'  group by idarticulo order by idarticulo asc";
				
								
			 con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			// stmt.setString(1, codigo_persona);
			rs = stmt.executeQuery();
			while (rs.next()) {
				Articulo vo = new Articulo();
				
				vo.setCod_articulo(rs.getString("idarticulo"));
				vo.setDescripcion(rs.getString("descripcion"));
				vo.setUni_med(rs.getString("unidadmed"));
				vo.setPrecio(rs.getDouble("precio"));
				vo.setEstado(rs.getString("estado"));
				l.add(vo);
			} 
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
		return l;
	}
	
	public Articulo GenerarCodigo() throws DAOExcepcion {
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		String Cad ="0";
		Integer Num = 0;
		try {
			String query = "Select max(idarticulo) as codigo from articulo";
			Articulo articulo = new Articulo();
			con = ConexionBD.obtenerConexion();
			stmt = con.prepareStatement(query);
			rs = stmt.executeQuery();
			if (rs.next()){
				Cad= rs.getString(1);
				if (Cad==null){
					Cad="0000";
				}
			}	
				Num = Integer.parseInt(Cad.substring(1, Cad.length()));
				Num = Num + 1;
				String convierte = String.valueOf(Num);
				String codigo= "000"+ convierte;
//				codigo=codigo.substring(0, codigo.length());
				
				 if(4 <=codigo.length()){  
					 int Inicio = (codigo.length() - 4 );   
					 codigo = codigo.substring(Inicio, codigo.length()); 
					 } 
				 else{   
					 codigo = Cad;
				 }
				codigo= "A"+codigo;
				articulo.setCod_articulo(codigo);
			
			 return articulo;
		} catch (SQLException e) {
			System.err.println(e.getMessage());
			throw new DAOExcepcion(e.getMessage());
		} finally {
			this.cerrarResultSet(rs);
			this.cerrarStatement(stmt);
			this.cerrarConexion(con);
		}
	}
	
}